package com.clothing.customization.repository;

import com.clothing.customization.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;
import java.util.Optional;

/**
 * 用户数据访问层
 */
@Repository
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
    
    /**
     * 根据用户名查找用户
     * @param username 用户名
     * @return Optional<User>
     */
    Optional<User> findByUsername(String username);
    
    /**
     * 根据用户名和角色查找用户
     * @param username 用户名
     * @param role 角色
     * @return Optional<User>
     */
    Optional<User> findByUsernameAndRole(String username, String role);
    
    /**
     * 判断用户名是否存在
     * @param username 用户名
     * @return boolean
     */
    boolean existsByUsername(String username);
    
    /**
     * 判断邮箱是否存在
     * @param email 邮箱
     * @return boolean
     */
    boolean existsByEmail(String email);
    
    /**
     * 判断手机号是否存在
     * @param phone 手机号
     * @return boolean
     */
    boolean existsByPhone(String phone);
    
    // 根据手机号查询用户
    Optional<User> findByPhone(String phone);
    
    // 根据邮箱查询用户
    Optional<User> findByEmail(String email);
    
    // 根据角色查询用户列表
    List<User> findByRoleOrderByCreateTimeDesc(String role);
    
    // 根据状态查询用户列表
    List<User> findByStatusOrderByCreateTimeDesc(Integer status);
    
    // 根据角色和状态查询用户列表
    List<User> findByRoleAndStatusOrderByCreateTimeDesc(String role, Integer status);
    
    // 统计用户收藏数量
    @Query("SELECT COUNT(u) FROM User u")
    long countUserFavorites();
    
    // 根据时间范围统计用户收藏数量
    @Query("SELECT COUNT(u) FROM User u WHERE u.createTime BETWEEN ?1 AND ?2")
    long countFavoritesByTimeBetween(Date startTime, Date endTime);
    
    // 根据用户名模糊查询用户列表
    List<User> findByUsernameContainingOrderByCreateTimeDesc(String username);
    
    // 根据真实姓名模糊查询用户列表
    List<User> findByRealNameContainingOrderByCreateTimeDesc(String realName);
    
    // 根据手机号模糊查询用户列表
    List<User> findByPhoneContainingOrderByCreateTimeDesc(String phone);
    
    // 根据邮箱模糊查询用户列表
    List<User> findByEmailContainingOrderByCreateTimeDesc(String email);
    
    // 统计各角色用户数量
    @Query("SELECT u.role, COUNT(u) FROM User u GROUP BY u.role")
    List<Object[]> countByRole();
    
    // 统计各状态用户数量
    @Query("SELECT u.status, COUNT(u) FROM User u GROUP BY u.status")
    List<Object[]> countByStatus();
    
    // 根据角色统计用户数量
    long countByRole(String role);
    
    // 根据状态统计用户数量
    long countByStatus(Integer status);
    
    // 根据创建时间范围统计用户数量
    long countByCreateTimeBetween(Date startTime, Date endTime);
    
    // 根据角色和创建时间范围统计用户数量
    long countByRoleAndCreateTimeBetween(String role, Date startTime, Date endTime);
    
    // 根据状态和创建时间范围统计用户数量
    long countByStatusAndCreateTimeBetween(Integer status, Date startTime, Date endTime);
} 